1 package edu.jiangxin.apktoolbox.file.password.recovery.checker;
2
3 import com.github.junrar.Archive;
4 import com.github.junrar.exception.CrcErrorException;
5 import com.github.junrar.exception.RarException;
6 import com.github.junrar.exception.UnsupportedRarV5Exception;
7 import com.github.junrar.rarfile.FileHeader;
8 import edu.jiangxin.apktoolbox.file.password.recovery.exception.UnknownException;
9 import edu.jiangxin.apktoolbox.file.password.recovery.exception.UnsupportedVersionException;
10
11 import java.io.IOException;
12 import java.io.OutputStream;
13
14 public final class RarChecker extends FileChecker {
15 private static final boolean DEBUG = false;
16
17 public RarChecker() {
18 super();
19 }
20
21 @Override
22 public String[] getFileExtensions() {
23 return new String[]{"rar"};
24 }
25
26 @Override
27 public String getFileDescription() {
28 return "*.rar";
29 }
30
31 @Override
32 public String getDescription() {
33 return "RAR Checker(Not support RAR5+)";
34 }
35
36 @Override
37 public boolean prepareChecker() {
38 return true;
39 }
40
41 @Override
42 public boolean checkPassword(String password) {
43 boolean result = false;
44 try (Archive archive = new Archive(file, password)) {
45 while (true) {
46 FileHeader fileHeader = archive.nextFileHeader();
47 if (fileHeader == null) {
48 break;
49 }
50 archive.extractFile(fileHeader, new OutputStream() {
51 @Override
52 public void write(int b) {
53 }
54 });
55 }
56 result = true;
57 } catch (CrcErrorException e) {
58 if (DEBUG) {
59 logger.error("[CrcErrorException]password is incorrect: {}", password);
60 }
61 } catch (UnsupportedRarV5Exception e) {
62 throw new UnsupportedVersionException(e);
63 } catch (RarException e) {
64 if (DEBUG) {
65 logger.error("[RarException]password is incorrect: {}", password);
66 }
67 } catch (IOException e) {
68 throw new UnknownException(e);
69 }
70 return result;
71 }
72 }